"""
@author: zwz
@file: 2022-11-25-练习.py
@time: 2022/11/25 0025 11:39:13
"""

#1、输入数字n，输出n天前的日期（time或者datatime模块）
import datetime
today = datetime.datetime.now()
n = int(input("请输入一个数字："))
offset = datetime.timedelta(days=-n)    #计算偏差时间
n_date = (today + offset).strftime('%Y-%m-%d')  #日期格式化
print(f"{n}天前的日期为：{n_date}")

#2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
import os.path
path = "E:\学习资料\三创\蜀山\开发项目\python\Python_project\项目"
items = os.listdir(path)
for item in items:
    print(item)

#3、列表去重，并且从小到大排序
lst = [1, 2, 32, 42, 1, 3, 2, 3, 4, 32]
lst1 = list(set(lst))
lst1.sort()
print(lst1)

#4、如何在一个函数内部修改全局变量
# 用global关键字在函数的开头声明这个变量是全局变量
# a = 23
# def num1():
#     a = 19
#     print(a)
# def num2():
#     global a
#     a = 18
#     print(a)
# num1()
# print("num1", a)
# num2()
# print("num2", a)

#5、如何跨模块共享全局变量
#   把全局变量都写在一个模块文件中，
#   使用的时候导入即可

#6、python的基本数据类型有哪些？
#   整数、浮点数、复数、字符串、布尔、NoneType、列表、元组、字典、集合

#7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
# 生成随机整数（1-10）
import random
n = random.randint(1, 10)
print(n)
# 随机小数（1-10）
n1 = random.uniform(1, 10)
print(n1)
# 随机小数（0-1）
n2 = random.random()
print(n2)

#8、python中哪些是可变数据类型，哪些是不可变数据类型
# python中的数据类型可分为6类：
# 1. Number(数字)  （bool布尔类型、int整型、float浮点型、complex复数等都归为Number数字类型）
# 2. String(字符串)
# 3. Tuple (元组)
# 4. List(列表)
# 5. Dictionary (字典)
# 6. Sets(集合)
# 可变数据类型：列表、集合、字典
# 不可变数据类型：数字、字符串、元组

#9、a+=1与a=a+1有什么区别
# a += 1 对于不可变数据类型内存地址发生改变，对于不可变数据类型内存地址不会改变
# a = a+1 无论可变还是不可变数据类型都会创建新的对象，内存地址发生改变
# a = [1,2]
# print(id(a))
# a += [3]
# print(id(a))
# a = a+[3]
# print(id(a))
#
# b = 1
# print(id(b))
# b += 1
# print(id(b))
# b = b+1
# print(id(b))

#10、什么是pep8？说出5点它的标准
# pep8 python编码风格指南
# 1、缩进使用四个空格
# 2、运算符的周围用空格 a = b / c
# 3、逗号后面使用空格
# 4、每一行代码控制在80个字符以内，超过了就用续行符
# 5、注释最好独占一行
# 6、函数和类与前面代码之间空两 行

#11、给定一个字符串，找出字符串第一个重复的字符
str1 = "afwergsfzfgbvgg"
for i in str1:
    count = str1.count(i)
    if count > 1:
        print(i)
        break

#12、简述深拷贝与浅拷贝
# 深拷贝:拷贝的程度深，自己新开辟了一块内存，将被拷贝内容全部拷贝过来了；
# 浅拷贝:拷贝的程度浅，只拷贝原数据的首地址，然后通过原数据的首地址，去获取内容。
# 只有在容器类型里面包含可变数据类型的时候,深浅拷贝会造成不同的影响
# 浅拷贝之后的数据改变,可能会影响原来的数据
# 深拷贝之后的数据改变,不会影响原来数据
# 因为,浅拷贝只拷贝容器类型里的第一层数据地址
# 而深拷贝会拷贝里面的每一层的值

#13、简述python内存机制
# 以引用计数为主，分代回收和标记清除为辅的垃圾回收方式
# 对[-5, 256]的小整数创建小整数池，可以直接用
# 对使用过的简单字符串存放在简单字符串驻留区

#14、使用python实现冒泡排序，快速排序
# 冒泡排序
a = [1, 34, 2, 45, 35, 322, 5, 667, 3, 6, 127, 3]
for i in range(len(a)):
    for j in range(0, len(a)-1-i):
        # 将列表前后两个数进行比较，大的放后面小的放前面
        # len(a)-1-i 剔除比对完的顶端数（最大/最小）,同时可以防止n+1超出下标界限
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]
print(a)

# 快速排序

def quick_sort(data):
    """快速排序"""
    if len(data) >= 2:  # 递归入口及出口
        mid = data[len(data) // 2]  # 选取基准值，也可以选取第一个或最后一个元素
        left, right = [], []  # 定义基准值左右两侧的列表
        data.remove(mid)  # 从原始数组中移除基准值
        for num in data:
            if num >= mid:
                right.append(num)
            else:
                left.append(num)
        return quick_sort(left) + [mid] + quick_sort(right)
    else:
        return data

print(quick_sort([1, 3, 54, 546, 642, 32, 534, 23, 5]))


#15、验证一个字符串是否属于回文（从左到右，从右到左都是一样）
str1 = "abcd123321dcba"
if str1 == str1[::-1]:
    print("是回文")
else:
    print("不是回文")

